
import bpy
import numpy as np

import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类
import Core.bl_UI配色 as UI配色

import engine.initLIB.load_dll as engineLib
import ctypes


engineLib.flexCAPI.f_创建从变换构建矩阵节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建矩阵坐标系转换节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建构建移动矩阵节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建构建旋转矩阵节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建构建缩放矩阵节点.restype = ctypes.c_bool



class C_Node_变换转矩阵4X4(基类.C_Node_基类):
	bl_dname = 'bl_node_变换转矩阵4X4'
	bl_label = '变换转矩阵4X4'
	
	def init(self, context):
		super(C_Node_变换转矩阵4X4, self).f_init(context)
		self.inputs.new('C_Socket_Vec3_Array1D', name='位置')
		self.inputs.new('C_Socket_Vec3_Array1D', name='旋转')
		self.inputs.new('C_Socket_Vec3_Array1D', name='缩放')
		self.outputs.new('C_Socket_矩阵4X4_Array1D', name='矩阵')
		self.f_toCPP()
		
		self.use_custom_color = True
		self.color = UI配色.g_内部节点颜色
		

	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建从变换构建矩阵节点(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), self.f_getPyObject());
		if 是否更新 :
			self.inputs['位置'].f_update()
			self.inputs['旋转'].f_update()
			self.inputs['缩放'].f_update()
			self.outputs['矩阵'].f_update()
		

class C_MENU_Add_变换转矩阵4X4(bpy.types.Operator):
	bl_idname = 'node.add_transform_from_matrix4x4'
	bl_label = '变换转矩阵4X4'
	#bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_变换转矩阵4X4', use_transform=True)
		return {'FINISHED'}

















def f_update_物体坐标系转换(self, context):
	data = list(str(self.m_坐标系转换))
	engineLib.flexCAPI.f_node_传入BL数据(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), ctypes.py_object(data));

	if context:
		self.id_data.f_节点数据更新_更新树([self])
	#print(self, 'f_update_物体坐标系转换', context)

class C_Node_矩阵坐标系转换(基类.C_Node_基类):
	bl_dname = 'bl_node_矩阵坐标系转换'
	bl_label = '矩阵坐标系转换'
	
	m_坐标系转换 = bpy.props.EnumProperty(items=基类.E_类型枚举_坐标系轴向, default='TYPE_右手转左手', name="坐标系转换", update=f_update_物体坐标系转换)
	def init(self, context):
		super(C_Node_矩阵坐标系转换, self).f_init(context)
		self.inputs.new('C_Socket_矩阵4X4_Array1D', name='矩阵')
		self.outputs.new('C_Socket_矩阵4X4_Array1D', name='矩阵')
		self.f_toCPP()
		
		self.use_custom_color = True
		self.color = UI配色.g_内部节点颜色
	
	def draw_buttons(self, context, layout):
		layout.prop(self, 'm_坐标系转换')

	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建矩阵坐标系转换节点(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), self.f_getPyObject());
		if 是否更新 :
			f_update_物体坐标系转换(self, None)

class C_MENU_Add_矩阵坐标系转换(bpy.types.Operator):
	bl_idname = 'node.add_mat_coord_sys_conversion'
	bl_label = '矩阵坐标系转换'
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_矩阵坐标系转换', use_transform=True)
		return {'FINISHED'}







class C_Node_构建移动矩阵节点(基类.C_Node_基类):
	bl_dname = 'bl_node_构建移动矩阵节点'
	bl_label = '构建移动矩阵节点'
	
	def init(self, context):
		super(C_Node_构建移动矩阵节点, self).f_init(context)
		self.inputs.new('C_Socket_Vec3_Array1D', name='位置')
		self.outputs.new('C_Socket_矩阵4X4_Array1D', name='矩阵')
		self.f_toCPP()
		
		self.use_custom_color = True
		self.color = UI配色.g_内部节点颜色
	
	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建构建移动矩阵节点(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), self.f_getPyObject());
		if 是否更新 :
			self.inputs['位置'].f_update()

class C_MENU_Add_构建移动矩阵节点(bpy.types.Operator):
	bl_idname = 'node.add_mat_build_loc'
	bl_label = '构建移动矩阵节点'
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_构建移动矩阵节点', use_transform=True)
		return {'FINISHED'}









def f_update_旋转矩阵创建轴向(self, context):
	data = list(str(self.m_创建轴向))
	engineLib.flexCAPI.f_node_传入BL数据(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), ctypes.py_object(data));

	if context:
		self.id_data.f_节点数据更新_更新树([self])

class C_Node_构建旋转矩阵节点(基类.C_Node_基类):
	bl_dname = 'bl_node_构建旋转矩阵节点'
	bl_label = '构建旋转矩阵节点'
	
	m_创建轴向 = bpy.props.EnumProperty(items=基类.E_类型枚举_轴向, default='TYPE_轴向X', name="轴向", update=f_update_旋转矩阵创建轴向)
	def init(self, context):
		super(C_Node_构建旋转矩阵节点, self).f_init(context)
		self.inputs.new('C_Socket_F32_Array1D', name='角度')
		self.outputs.new('C_Socket_矩阵4X4_Array1D', name='矩阵')
		self.f_toCPP()
		
		self.use_custom_color = True
		self.color = UI配色.g_内部节点颜色
	
	def draw_buttons(self, context, layout):
		layout.prop(self, "m_创建轴向")
		
	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建构建旋转矩阵节点(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), self.f_getPyObject());
		if 是否更新 :
			f_update_旋转矩阵创建轴向(self, None)
			self.inputs['角度'].f_update()

class C_MENU_Add_构建旋转矩阵节点(bpy.types.Operator):
	bl_idname = 'node.add_mat_build_rot'
	bl_label = '构建旋转矩阵节点'
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_构建旋转矩阵节点', use_transform=True)
		return {'FINISHED'}










class C_Node_构建缩放矩阵节点(基类.C_Node_基类):
	bl_dname = 'bl_node_构建缩放矩阵节点'
	bl_label = '构建缩放矩阵节点'
	
	def init(self, context):
		super(C_Node_构建缩放矩阵节点, self).f_init(context)
		self.inputs.new('C_Socket_Vec3_Array1D', name='缩放')
		self.outputs.new('C_Socket_矩阵4X4_Array1D', name='矩阵')
		self.f_toCPP()
		
		self.use_custom_color = True
		self.color = UI配色.g_内部节点颜色
	
	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建构建缩放矩阵节点(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), self.f_getPyObject());
		if 是否更新 :
			self.inputs['缩放'].f_update()

class C_MENU_Add_构建缩放矩阵节点(bpy.types.Operator):
	bl_idname = 'node.add_mat_build_sca'
	bl_label = '构建缩放矩阵节点'
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_构建缩放矩阵节点', use_transform=True)
		return {'FINISHED'}















classes = (
	C_Node_变换转矩阵4X4,
	C_MENU_Add_变换转矩阵4X4,


	C_Node_矩阵坐标系转换,
	C_MENU_Add_矩阵坐标系转换,

	C_Node_构建移动矩阵节点,
	C_MENU_Add_构建移动矩阵节点,

	C_Node_构建旋转矩阵节点,
	C_MENU_Add_构建旋转矩阵节点,

	C_Node_构建缩放矩阵节点,
	C_MENU_Add_构建缩放矩阵节点,


)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)



